const GROUP_NAME = 'items';
const {
  getItems,
  addItem,
  getItemById,
  deleteItemById,
  updateItemById,
  isExist,
  itemSort,
} = require('../handler/itemsHandler');

exports.plugin = {
  name: 'routerItems',
  async register(server) {
    const { Joi, headers } = server;
    await server.route([

      { // 选项排序
        method: 'put',
        path: `/${GROUP_NAME}/sort/{firstId}/{secondId}`,
        handler: itemSort,
        config: {
          notes: '选项排序',
          description: '选项排序（交换两个同级选项的位置）',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              firstId: Joi.string().required().hex().length(24)
                .description('第1个id')
                .error(() => new Error('第1个id非法')),
              secondId: Joi.string().required().hex().length(24)
                .description('第2个id')
                .error(() => new Error('第2个id非法')),
            }),
          },
        },
      },

      { // 获取选项
        method: 'get',
        path: `/${GROUP_NAME}`,
        handler: getItems,
        config: {
          notes: '获取选项',
          description: '获取选项',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
          },
        },
      },

      { // 添加选项
        method: 'post',
        path: `/${GROUP_NAME}`,
        handler: addItem,
        config: {
          notes: '添加选项',
          description: '添加选项',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            payload: Joi.object({
              pid: Joi.string().hex()
                .length(24)
                .description('上级选项id')
                .error(() => new Error('上级选项id非法')),
              itemname: Joi.string().required().trim()
                .description('选项:2-18个字符组合')
                .error(() => new Error('选项:2-18个字符组合')),
            }),
          },
        },
      },

      { // 根据id获取单个选项信息
        method: 'GET',
        path: `/${GROUP_NAME}/{id}`,
        handler: getItemById,
        config: {
          notes: '根据ID获取单个选项信息',
          description: '根据ID获取单个选项信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('选项id')
                .error(() => new Error('选项id非法')),
            }),
          },
        },
      },


      { // 根据ID删除选项
        method: 'delete',
        path: `/${GROUP_NAME}/{id}`,
        handler: deleteItemById,
        config: {
          notes: '根据ID删除选项',
          description: '根据ID删除选项',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('选项id')
                .error(() => new Error('选项id非法')),
            }),
          },
        },
      },

      { // 根据ID编辑选项信息
        method: 'put',
        path: `/${GROUP_NAME}/{id}`,
        handler: updateItemById,
        config: {
          notes: '根据ID更新选项信息',
          description: '根据ID更新选项信息',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('选项id')
                .error(() => new Error('选项id非法')),
            }),
            payload: Joi.object({
              itemname: Joi.string().trim()
                .description('选项:2-18个字符组合')
                .error(() => new Error('选项:2-18个字符组合')),
            }),
          },
        },
      },

      { // 判断字段值是否存在
        method: 'get',
        path: `/${GROUP_NAME}/exist`,
        handler: isExist,
        config: {
          notes: '判断字段值是否存在',
          description: '判断字段值是否存在',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              field: Joi.string().required().allow('itemname')
                .description('字段名')
                .error(() => new Error('字段名非法')),
              value: Joi.string().required()
                .description('值')
                .error(() => new Error('值必须填写')),
            }),
          },
        },
      },
      //
    ]);
  },
};
